package main

import "fmt"

func main() {
	//map类型  key和value的映射关系
	//定义一个map类型  map[key类型]value类型
	var m1 map[string]int  //map是引用数据类型  这样得到的是空指针
	fmt.Println(m1 == nil) //true

	//make为map初始化空间
	m1 = make(map[string]int, 10) //make(类型， 长度)
	fmt.Println(m1 == nil)        //false

	//map装填键值对
	m1["a"] = 1
	m1["b"] = 2
	fmt.Println(m1) //map[a:1 b:2]

	//map根据key取value
	v1 := m1["a"]
	fmt.Println(v1) //1

	v1_2, ok1 := m1["dddd"] //这种取值方式  第二个值是bool值 用于表示存不存在这个key
	fmt.Println(v1_2, ok1)  //0 false     没有这个key时  返回的是value类型的初始值

	//map遍历
	for k, v := range m1 {
		fmt.Println(k, v)
	}
	//只遍历key
	for k1 := range m1 {
		fmt.Println(k1)
	}

	//删除map中的元素
	delete(m1, "a")        //delete函数
	fmt.Println(m1)        //map[b:2]
	delete(m1, "asdasdaf") //不存在这个key就什么都不做

	//map和slice
	//1.元素类型为map的slice
	s1 := make([]map[string]int, 5, 10) //make只是对slice初始化  里面的map元素都没初始化  都是空指针
	s1[0] = make(map[string]int, 5)
	s1[0]["key1"] = 1
	s1[0]["key2"] = 2
	fmt.Println(s1) //[map[key1:1 key2:2] map[] map[] map[] map[]]

	//2.键/值类型为slice的map
	m2 := make(map[string][]int, 5)
	m2["key1"] = []int{1, 2, 3, 4, 5}
	m2["key2"] = []int{3, 4, 5}
	fmt.Println(m2) //map[key1:[1 2 3 4 5] key2:[3 4 5]]
}
